package com.test19_多线程;

/**
 * 线程死锁
 * 程序中出现有一个资源互相占用且互相等待的一种处理机制，
 * 同时当程序执行之后会发现由于死锁的问题，程序执行到一半之后就不再向下继续执行了。
 * 结论：多个线程更新同一资源的时候必须考虑到同步，而同步所带来的问题就是线程的死锁。
 */
public class Demo08_Deadlock {

    /**
     * 模拟线程死锁
     */
    public static void main(String[] args) {
        Book book = new Book();
        Paint paint = new Paint();
        Thread threadA = new Thread(() -> {
            synchronized (book) {   // A线程锁定图书
                System.out.println("A对B说：你给我你的画，我再借你看我的书。");
                try {
                    Thread.sleep(1000);
                    synchronized (paint) {
                        Thread.sleep(1000);
                        System.out.println("A得到了B的画。");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread threadB = new Thread(() -> {
            synchronized (paint) {   // B线程锁定绘画
                System.out.println("B对A说：你借我你的书，我再给你我的画。");
                try {
                    Thread.sleep(1000);
                    synchronized (book) {
                        Thread.sleep(1000);
                        System.out.println("B得到了A的书。");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        threadA.start();
        threadB.start();
    }
}

/** 描述书的资源 */
class Book {
}

/** 描述画的资源 */
class Paint {
}
